const char *remote,
const char *ref,
gboolean allow_noent,
+ gboolean fallback_remote,
char **out_rev,
GError **error);
const char *remote,
const char *ref,
gboolean allow_noent,
+ gboolean fallback_remote,
char **out_rev,
GCancellable *cancellable,
GError **error)
if (self->parent_repo)
{
- if (!resolve_refspec (self->parent_repo, remote, ref,
- allow_noent, &ret_rev, error))
+ if (!resolve_refspec (self->parent_repo, remote, ref, allow_noent,
+ fallback_remote, &ret_rev, error))
goto out;
}
else if (!allow_noent)
const char *remote,
const char *ref,
gboolean allow_noent,
+ gboolean fallback_remote,
char **out_rev,
GError **error)
{
if (!ot_openat_ignore_enoent (self->repo_dir_fd, local_ref, &target_fd, error))
goto out;
- if (target_fd == -1)
+ if (target_fd == -1 && fallback_remote)
{
local_ref = glnx_strjoina ("refs/remotes/", ref);
}
else
{
- if (!resolve_refspec_fallback (self, remote, ref, allow_noent,
+ if (!resolve_refspec_fallback (self, remote, ref, allow_noent, fallback_remote,
&ret_rev, cancellable, error))
goto out;
}
return ret;
}
-/**
- * ostree_repo_resolve_rev:
- * @self: Repo
- * @refspec: A refspec
- * @allow_noent: Do not throw an error if refspec does not exist
- * @out_rev: (out) (transfer full): A checksum,or %NULL if @allow_noent is true and it does not exist
- * @error: Error
- *
- * Look up the given refspec, returning the checksum it references in
- * the parameter @out_rev.
- */
-gboolean
-ostree_repo_resolve_rev (OstreeRepo *self,
- const char *refspec,
- gboolean allow_noent,
- char **out_rev,
- GError **error)
+static gboolean
+_ostree_repo_resolve_rev_internal (OstreeRepo *self,
+ const char *refspec,
+ gboolean allow_noent,
+ gboolean fallback_remote,
+ char **out_rev,
+ GError **error)
{
gboolean ret = FALSE;
g_autofree char *ret_rev = NULL;
goto out;
if (!resolve_refspec (self, remote, ref, allow_noent,
- &ret_rev, error))
+ fallback_remote, &ret_rev, error))
goto out;
}
}
return ret;
}
+/**
+ * ostree_repo_resolve_rev:
+ * @self: Repo
+ * @refspec: A refspec
+ * @allow_noent: Do not throw an error if refspec does not exist
+ * @out_rev: (out) (transfer full): A checksum,or %NULL if @allow_noent is true and it does not exist
+ * @error: Error
+ *
+ * Look up the given refspec, returning the checksum it references in
+ * the parameter @out_rev. Will fall back on remote directory if cannot
+ * find the given refspec in local.
+ */
+gboolean
+ostree_repo_resolve_rev (OstreeRepo *self,
+ const char *refspec,
+ gboolean allow_noent,
+ char **out_rev,
+ GError **error)
+{
+ return _ostree_repo_resolve_rev_internal (self, refspec, allow_noent, TRUE, out_rev, error);
+}
+
+/**
+ * ostree_repo_resolve_rev_ext:
+ * @self: Repo
+ * @refspec: A refspec
+ * @allow_noent: Do not throw an error if refspec does not exist
+ * @flags: Options controlling behavior
+ * @out_rev: (out) (transfer full): A checksum,or %NULL if @allow_noent is true and it does not exist
+ * @error: Error
+ *
+ * Look up the given refspec, returning the checksum it references in
+ * the parameter @out_rev. Differently from ostree_repo_resolve_rev(),
+ * this will not fall back to searching through remote repos if a
+ * local ref is specified but not found.
+ */
+gboolean
+ostree_repo_resolve_rev_ext (OstreeRepo *self,
+ const char *refspec,
+ gboolean allow_noent,
+ OstreeRepoResolveRevExtFlags flags,
+ char **out_rev,
+ GError **error)
+{
+ return _ostree_repo_resolve_rev_internal (self, refspec, allow_noent, FALSE, out_rev, error);
+}
+
static gboolean
enumerate_refs_recurse (OstreeRepo *repo,
const char *remote,
{
g_autofree char *checksum = NULL;
g_autofree char *checksum_existing = NULL;
+ g_autofree char *remote = NULL;
+ g_autofree char *ref = NULL;
- if (!ostree_repo_resolve_rev (repo, opt_create, TRUE, &checksum_existing, error))
+ if (!ostree_repo_resolve_rev_ext (repo, opt_create, TRUE, OSTREE_REPO_RESOLVE_REV_EXT_NONE, &checksum_existing, error))
{
if (g_error_matches (*error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY))
{
if (!ostree_repo_resolve_rev (repo, refspec_prefix, FALSE, &checksum, error))
goto out;
- if (!ostree_repo_set_ref_immediate (repo, NULL, opt_create, checksum,
+ if (!ostree_parse_refspec (opt_create, &remote, &ref, error))
+ goto out;
+
+ if (!ostree_repo_set_ref_immediate (repo, remote, ref, checksum,
cancellable, error))
goto out;
}
${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount.create4
assert_file_has_content refscount.create4 "^6$"
+#Check if a name for a ref in remote repo can be used locally, and vice versa.
+${CMD_PREFIX} ostree --repo=repo commit --branch=origin:remote1
+${CMD_PREFIX} ostree --repo=repo commit --branch=local1
+${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount.create5
+assert_file_has_content refscount.create5 "^8$"
+
+${CMD_PREFIX} ostree --repo=repo refs origin:remote1 --create=remote1
+${CMD_PREFIX} ostree --repo=repo refs origin:remote1 --create=origin/remote1
+${CMD_PREFIX} ostree --repo=repo refs local1 --create=origin:local1
+${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount.create6
+assert_file_has_content refscount.create6 "^11$"
+
echo "ok refs"